package com.bjpowernode.javaWeb.servlet;

import jakarta.servlet.*;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;

/**
 * ServletConfig
 *  1.ServletConfig是什么
 *      jakarta.servlet.ServletConfig
 *      显然ServletConfig是Servlet规范中的一员
 *      ServletConfig是一个接口 （jakarta.servlet.Servlet是一个接口）
 *  2.谁实现了这个接口
 *      public class org.apache.catalina.core.StandardWrapperFacade implements ServletConfig(){}
 *      结论：Tomcat服务器是西安了ServletConfig接口
 *      思考：如果把Tomcat服务器换成jetty服务器，输出ServletConfig对象时，还是这个结果吗？
 *          不一定，包名类名可能和Tomcat不一样，但是实现了ServletConfig这个规范
 *  3.一个Servlet对象中有一个ServletConfig对象。Servlet对象和ServletConfig对象一一对应
 *  4.ServletConfig对象是谁创建的？什么时候创建的？
 *      Tomcat服务器创建的
 *      在创建Servlet对象创建的时候，同时创建了ServletConfig对象
 *  5.ServletConfig有什么用？
 *      Config是那个单词缩写？
 *          Configuration
 *      ServletConfig对象被翻译为：Servlet对象的配置信息对象
 *      一个Servlet对象就有一个ServletConfig对象
 *      两个Servlet对象就有两个ServletConfig对象
 *  6.ServletConfig对象中包装了什么信息？
 *      <servlet>
 *         <servlet-name>config2</servlet-name>
 *         <servlet-class>com.bjpowernode.javaWeb.servlet.ConfigTextServlet2</servlet-class>
 *     </servlet>
 *     ServletConfig对象中包装的信息是：
 *          web.xml文件中<servlet></servlet>标签的配置信息
 *     Tomcat服务器解析web.xml，将web.xml文件中<servlet-name></servlet-name>标签中的配置信息自动包装到ServletConfig对象中
 *  7.ServletConfig中的方法
 *      <servlet>
 *         <servlet-name>config</servlet-name>
 *         <servlet-class>com.bjpowernode.javaWeb.servlet.ConfigTextServlet</servlet-class>
 *         <!--这个可以配置一个Servlet对象初始化信息-->
 *         <init-param>
 *             <param-name>diriver</param-name>
 *             <param-value>com.mysql.cj.jdbc.Driver</param-value>
 *         </init-param>
 *         <init-param>
 *             <param-name>url</param-name>
 *             <param-value>jdbc:mysql://localhost:3306/library</param-value>
 *         </init-param>
 *         <init-param>
 *             <param-name>user</param-name>
 *             <param-value>root</param-value>
 *         </init-param>
 *         <init-param>
 *             <param-name>password</param-name>
 *             <param-value>admin</param-value>
 *         </init-param>
 *     </servlet>
 *     以上<servlet></servlet>标签中的<init-param></init-param>是初始化参数，这个参数信息会自动被Tomcat封装到ServletConfig对象中
 *     Enumeration<String> getInitParameterNames() 获取所有初始化参数的name
 *     String getInitParameter(String name)
 *   8.ServletConfig中有四个方法
 *      第一个方法
 *          public String getInitParameter(String name);
 *      第二个方法
 *          public Enumeration<String> getInitNames();
 *      第三个方法
 *          public ServletContext getServletContext();
 *      第四个方法
 *          public String getServletName();
 *      以上四个方法，在自己编写的Servlet类中也可以通过this去调用（这个Servlet继承了GenericServlet）
 */
public class ConfigTextServlet extends GenericServlet {
    @Override
    public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html");
        PrintWriter out=response.getWriter();


        //获取ServletConfig对象
        ServletConfig config=getServletConfig();

        //输出该对象
        out.print("ServletConfig对象是："+config+"</br>");

        //获取<servlet-name></servlet-name>
        String servletName=config.getServletName();
        out.print("<servlet-name>"+servletName+"</servlet-name></br>");

        //通过ServletConfig对象中的两个方法，可以获得web.xml文件中的初始化参数信息
        //String getInitParameter(String name)
        //Enumeration<String> getInitParameterNames()
        Enumeration<String> initParameterNames = config.getInitParameterNames();
        //遍历集合
        while (initParameterNames.hasMoreElements()){
            String paraName=initParameterNames.nextElement();
            String param=config.getInitParameter(paraName);
            out.print(paraName+"="+param+"</br>");
        }

        //事实上获取一个ServletConfig对象的初始化参数，可以不用获取ServletConfig对象，直接通过this也可以
        Enumeration<String> names=this.getInitParameterNames();
        while (names.hasMoreElements()){
            String name=names.nextElement();
            String value=this.getInitParameter(name);
            out.print(name+"="+value+"</br>");
        }

        //1.通过ServletConfig对象获得ServletContext对象
        //2.通过this也可以获取ServletContext对象
        ServletContext application = config.getServletContext();
        out.print(application+"</br>");
        //org.apache.catalina.core.ApplicationContextFacade@10c2aa64

        //通过this获得ServletContext对象
        ServletContext application2=this.getServletContext();
        out.print(application2+"</br>");
        //org.apache.catalina.core.ApplicationContextFacade@10c2aa64
    }
}
